{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：数据库的三范式\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "如何设计数据库是一个很复杂的问题，一旦设计的不好，对性能也会产生不小的影响。但很多问题都可以套用一定的模式去解决。\n",
    "\n",
    "答案\n",
    "第一范式：要求有主键，并且要求每一个字段原子性不可再分；\n",
    "\n",
    "第二范式：要求所有非主键字段完全依赖主键，不能产生部分依赖；\n",
    "\n",
    "第三范式：所有非主键字段和主键字段之间不能产生传递依赖。\n",
    "\n",
    "拓展\n",
    "数据库范式（规范化，Normalization）是一种组织数据库中数据的技术。范式是一种拆分表格的系统方法，以消除数据冗余（重复）和减少插入，更新和删除过程引入的异常。范式确保将较大的表划分为较小的表，并使用关系将它们链接起来。\n",
    "\n",
    "数据库规范化用于以下目的：\n",
    "\n",
    "消除冗余或无用的数据；\n",
    "减少数据的复杂性；\n",
    "确保表之间以及表中数据之间的关系；\n",
    "确保数据依赖性和数据被逻辑存储。\n",
    "什么是数据冗余？\n",
    "当同一数据保存在两个不同的位置时，就会发生数据冗余。就像下面这个表一样：\n",
    "\n",
    "rollno\tname\tbranch\thod\toffice_tel\n",
    "401\tAkon\tCSE\tMr. X\t53337\n",
    "402\tBkon\tCSE\tMr. X\t53337\n",
    "403\tCkon\tCSE\tMr. X\t53337\n",
    "上面这个表格是 3 个 CS 系学生的数据。这个表格中，后面三列的数据是一样的，其实都是同一个branch，CSE的相关的数据：branch，head of department, office tel.。那么必然，这会需要更多的空间去存储这些冗余数据，过多的冗余数据不利于检索。\n",
    "\n",
    "我们假想一下，如果表格设计采取这种无范式的，首先就是插入操作带来的冗余问题，比如，有新生入学，那么就需要重复学生的同一个 branch 信息。除了冗余，还会什么问题呢？假设我们更新 hoc信息，将Mr. Xupdate到Mr. Y，那么与之关联的所有的学生记录都必须更新，如果在更新的过程中出现异常，那么可能会导致一部分数据已更新，剩余的数据保持不变，这样数据必然会不一致。再如果，去删除某一个 branch 呢？这会有什么后果？可能删除这个branch的所有学生记录，那么就会有丢失数据的风险。\n",
    "\n",
    "如果将表格按范式的要求去设计，将 branch 独立出来成为一个新表，那么以上的问题就没有了。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}